window.joView = {};
/**
 * 接管函数列表:
 * 1.设置Grid标题:joView.setGridHead()
 * 2.设置Grid数据:joView.setGridData(oList)
 * 3.加工Grid中每个小格显示的值:joView.handleItemValue(sVal,iIndex)
 * 4.处理Grid中的行对象(可以取代接管函数3):joView.handleItem(oItem,iIndex)
 * 5.生成数据行的前置处理:joView.setGridDataBefore(oList)
 * 6.生成数据行的后置处理:joView.setGridDataAfter(oList);
 * 7.数据行的点击事件(参数为主键值):joView.clickItem(id)
 * 8.生成数据列表后的操作:joView.setGridDataAfter(oList);
 * 9.删除操作成功结束后的回调(参数1为后台返回的结果,参数2为删除的编号集):joView.delSuccessOver(result, idStr);
 */
/**
 * joView参数
 */
joView.params = {
	"transferParam" : "",//向表单页传参
	"pageSizeArr" : [10,25,50,75,100],//每页多少条选择集合
	"JS_table" : "page/js/table.js",//Grid特效,已停用
	"page" : true,//是否进行分页,默认为true,2019-04-04新加参数,暂时只在layui中有效
	"currentPage" : 1,//当前页,默认第一页
	"pageSize" : 10,//每页多少条
	"url" : "",//分页查询url
	"formData" : null,//分页查询参数(查询表单中的参数+其他参数(例如排序参数orderBy等))
	"condition" : "",//查询条件(自定义查询条件key=value&key2=value2形式),也可以是object类型
	"colsInfo" : null,//展示列表的列信息(名称,值,宽度等)
	"checkStyle" : "checkBox",//选择框样式,checkBox:多选框|radio:单选框|order:序号|none:没有选择框
	"checkStyleWidth" : "5%",//选择框宽度,默认5%
	"PKName" : "ID",//主键
	"formUrl" : "",//[新增/修改]表单地址
	"deleteUrl" : "",//[删除]数据的url
	"dataUrl" : "",//[Grid数据]的url
	"grid" : null//grid表格jq对象	2017-06-16新增参数
	,"formWidth" : "780px"//表单窗口的宽度,2018-03-05新加参数
	,"formHeight" : "80%"//表单窗口的高度,2018-03-05新加参数
	,"winTitleOfAdd" : "新增"//新增弹窗的标题,2018-03-05新加参数
	,"winTitleOfUpdate" : "编辑"//修改弹窗的标题,2018-03-05新加参数
	,"winNameOfAdd" : "WIN_ADD"//新增弹窗的标题,2018-03-05新加参数
	,"winNameOfUpdate" : "WIN_EDIT"//修改弹窗的标题,2018-03-05新加参数
	,"orderBy" : ""//排序字段,2018-04-25新加参数
	,"orderType" : ""//排序类型,asc:升序|desc:降序,2018-04-25新加参数
	,"winRender" : "self"//表单窗口打开位置,top:顶部窗口|parent:父窗口|self:本窗口(默认),2018-07-12新加参数
	,"autoLoad" : true//自动加载
};
/**
 * 标记joView对象是否发生初始化,即是否有使用
 * @type {boolean}
 */
joView.inited = false;
/**
 * grid表格jq对象
 * @date 2017-06-16
 * @type {null}
 */
joView.grid = null;
/**
 * 格式化后的Grid对象(**仅供内部方法使用,禁止外部调用)
 * @type {null}
 */
joView.Grid = null;
/**
 * 初始化grid对象
 * 如果需要继续添加自定义属性,需要同时在Grid类中做处理
 */
joView.initGrid = function(oGrid){
	if(jo.isValid(oGrid)){
		joView.grid = $(oGrid);//jq对象
		joView.Grid = new Grid(joView.grid);//格式化后的Grid对象
		joView.params["formUrl"] = joView.Grid.formUrl;//[新增/修改]表单地址
		joView.params["deleteUrl"] = joView.Grid.deleteUrl;//[删除]数据的url
		joView.params["dataUrl"] = joView.Grid.dataUrl;//[Grid数据]的url
		joView.params["colsInfo"] = joView.Grid.colsInfo();
		var _html = "<thead></thead><tbody></tbody>";
		joView.grid.html(_html);//插入head和body,因为joView里面用到这2个标签,在这里作插入就可以省去在html中写
	}
};
/**
 * 设置传输参数
 */
joView.setTransferParam = function(sParam){
	joView.params["transferParam"] = sParam;
};
/**
 * 设置joView参数
 */
joView.putParam = function(sKey,sValue){
	joView.params[sKey] = sValue;
};
/**
 * 批量设置joView参数
 */
joView.putParams = function(oParams){
	joView.params = $.extend({},joView.params, oParams);
};
/**
 * 设置查询参数,适用于设置具体某个参数
 * @param key key
 * @param value value
 */
joView.putQueryParam = function(key, value){
	if(key){
		if(joView.params["condition"] && typeof (joView.params["condition"]) == 'object'){//对象类型
			joView.params["condition"][key] = value;
		}else if(joView.params["condition"] && typeof (joView.params["condition"]) == 'string'){//字符串类型
			joView.params["condition"] += key + '&' + value;
		}else{//默认设置为对象类型
			joView.params["condition"] = {};
			joView.params["condition"][key] = value;
		}
	}
};
/**
 * 替换查询参数,适用于完全替换原有的参数
 * @param queryParams
 */
joView.setQueryParam = function(queryParams){
	joView.params["condition"] = queryParams;
};
/**
 * 页面初始化
 * 1.初始化html元素;
 * 2.格式化样式;
 * 3.初始化数据;
 */
joView.init = function(oParams){
	//将使用标记切换为true
	joView.inited = true;
	//初始化joView参数
	if(jo.isValid(oParams)){
		if(oParams.grid){
			joView.initGrid(oParams.grid);//初始化grid对象
		}else{//没有传入grid,默认为$("#mainList")
			joView.grid = $("#mainList");
		}
		//joView对象的一切参数还是以传入的参数为准,传入的参数可以覆盖掉grid对象中设置的参数
		joView.putParams(oParams);
	}
	//初始化视图页面参数,bam入口
	joView.initViewParams();
	//格式化样式
	joView.formatUI();
	//初始化列表数据
	if(joView.params["autoLoad"]){//当autoLoad开启时自动加载数据
		joView.select();
	}
	//覆盖原先[重新加载当前页]函数,为了兼容jo-page-form.js的重新加载父页面数据操作
	if(typeof(reloadCurrentPage) == "function"){reloadCurrentPage = joView.reloadCurrentPage;}else{window.reloadCurrentPage = joView.reloadCurrentPage;}
};

/**
 * 查询数据
 * 需要对查询参数做调整,通常在本方法进行
 */
joView.select = function(){
	//查询
	if(jo.isValid(joView.params["dataUrl"])){
		//$("#mainList>tbody").html("");
		joView.clearGrid();//清空
		//每次加载都要刷新url和formData参数(如果有的话)
		if(jo.isValid(document.getElementById("pageForm"))){
			joView.params["formData"] = jo.form2Json(jo._("#pageForm"));//new FormData($("#pageForm")[0]);
		}else{
			joView.params["formData"] = {};//new FormData($("#pageForm")[0]);
		}
		//为了避免查询表单中参数名与排序参数重复
		if(typeof (joView.params["formData"]["orderBy"]) != "undefined" || typeof (joView.params["formData"]["orderType"]) != "undefined"){//表单存在orderBy或orderType关键字
			console.warn("[joView列表查询] 检索表单中存在orderBy或orderType参数字段,与joView排序功能关键字产生冲突!这将导致您的自定义排序功能失效!");
		}else{
			//插入排序参数
			joView.params["formData"]["orderBy"] = joView.params["orderBy"];
			joView.params["formData"]["orderType"] = joView.params["orderType"];
		}
		//额外携带condition自定义查询参数
		if(joView.params["condition"] && typeof (joView.params["condition"]) == 'string'){//字符串类型
			joView.params["url"] = joView.params["dataUrl"] + jo.getLinkSign(joView.params["dataUrl"]) + joView.params["condition"];
		}else if(joView.params["condition"] && typeof (joView.params["condition"]) == 'object'){//object类型
			joView.params["formData"] = $.extend({}, joView.params["formData"], joView.params["condition"]);//将参数聚合到一起
			joView.params["url"] = joView.params["dataUrl"];
		}else{
			joView.params["url"] = joView.params["dataUrl"];
		}
		//加载第一页数据
		joView.goPage(1);
	}
};
/**
 * 切换到第几页,这里不对查询参数做调整,调用select()方法才会对查询参数做重新计算
 * 该方法是对joView.loadData的简化,通常在调用该方法前将需要设置的参数赋值给joView.params
 * @param goPage 去第几页
 */
joView.goPage = function(goPage){
	joView.loadData(joView.params["url"], joView.params["formData"], goPage, joView.params["pageSize"]);
};
/**
 * 加载数据
 * 该方法为基础方法,被调用时要从joView.params中取数据,在该方法内部不对参数进行任何关于joView.params处理
 * @param url 加载数据的url
 * @param formData 查询参数
 * @param goPage 第几页
 * @param pageSize 每页多少条
 */
joView.loadData = function(url,formData,goPage,pageSize){
	jo.showLoading("正在加载...");
	if(!goPage){
		goPage = 1;//默认第一页
	}
	if(!pageSize){
		pageSize = "";
	}
	if(url.indexOf("?") >= 0){//传进来的URL带有参数
		url += jo.getLinkSign(url)+"pageNumber=" + goPage + "&pageSize=" + pageSize;
	}else{
		url += "?pageNumber=" + goPage + "&pageSize=" + pageSize;
	}

	var formData = formData;
	var url = url;
	jo.postAjax(url, formData, function(result){
		var list = result ? result.data : null;
		if(list != null && list.length>0){
			try {
				joView.showData(list, result);
			}catch(err){
				jo.showMsg("发生异常,请检查joView.showData()方法是否出错!");
				console.error(err);
			}finally{}//自定义方法展示数据
		}else{//为空,清空原有数据
			//$("#mainList>tbody").html("");
			joView.clearGrid();
		}
		//更新分页信息
		try{
			if(result){
				joView.showPageInfo(result);
			}
		}catch(err){
			console.info("更新分页信息异常!"+err);
		}
		jo.showLoading(false);
	});
};
/**
 * 清空表格数据
 */
joView.clearGrid = function(){
	joView.grid.find(">tbody").html("");
};
/**
 * 展示数据,即将数据填充到表格
 * oList:数据列表
 * oResult:后台返回结果，含分页参数（若有分页的话）
 */
joView.showData = function(oList, oResult){
	if(jo.isValid(joView.params["colsInfo"])){
		var currentPage = 1;//当前页
		var pageSize = 0;//每页多少条
		if(oResult && oResult.pageNumber){
			currentPage = oResult.pageNumber;
		}
		if(oResult && oResult.pageSize){
			pageSize = oResult.pageSize;
		}
		var showFieldsInfo = joView.params["colsInfo"];
		var checkStyle = jo.getDefVal(joView.params["checkStyle"],"");
		/*
		 * 生成表头
		 */
		/*if(typeof(joView.setGridHead) == "function"){//生成Grid头接管函数
			joView.setGridHead();
		}else{
			var _headHtml = "<tr>";
			if(checkStyle == "checkBox"){//复选框
				_headHtml += '<td style="width:5%;"><input type="checkbox" onclick="checkAll()" id="checkAll"/></td>';
			}else if(checkStyle == "radio"){//单选框
				_headHtml += '<td style="width:5%;">选择</td>';
			}else{
				//不要选择框
			}
			//遍历生产表头
			for( var i=0;i<showFieldsInfo.length;i++){
				_headHtml += '<td style="width:' + showFieldsInfo[i]["width"] + ';">' + showFieldsInfo[i]["title"] + '</td>';
			}
			_headHtml += "</tr>";
			$("#mainList>thead").html(_headHtml);
		}*/
		/*
		 * 生成数据行
		 */
		if(typeof(joView.setGridDataBefore) == "function"){//生成数据行的前置处理
			try{
				joView.setGridDataBefore(oList);
			}catch(err){
				jo.showMsg("joView.setGridDataBefore方法异常!");
			}
		}
		if(typeof(joView.setGridData) == "function"){//生成Grid数据接管函数
			try{
				joView.setGridData(oList);
			}catch(err){
				jo.showMsg("joView.setGridData方法异常!");
			}
		}else{
			var _html = "";
			for(var i=0;i<oList.length;i++){
				//处理数据行对象
				if(typeof(joView.handleItem) == "function"){
					joView.handleItem(oList[i],i);
				}
				var trCss = jo.getDefVal(oList[i]['_css'], '');//行样式
				var trStyle = jo.getDefVal(oList[i]['_style'], '');//行style
				_html += '<tr class="'+trCss+'" style="'+trStyle+'">';
				//与列表展示的表头对应
				var sHtml = oList[i]["CheckBoxStyleHtml"];
				if(jo.isValid(sHtml)){
					_html += '<td style="text-align: center;">'+sHtml+'</td>';
				}else if(checkStyle == "checkBox"){//复选框
					_html += "<td style=\"text-align: center;\"><input type='checkbox' id='"+joView.params["PKName"]+"' name='"+joView.params["PKName"]+"' value='"+oList[i][joView.params["PKName"]]+"'/></td>";//复选框
				}else if(checkStyle == "radio"){//单选框
					_html += '<td style="text-align: center;"><input type="radio" name="'+joView.params["PKName"]+'" value="'+oList[i][joView.params["PKName"]]+'"></td>';
				}else if(checkStyle == "order"){
					_html += '<td style="text-align: center;">'+((currentPage - 1) * pageSize + i + 1)+'</td>';
				}else{
					//不要选择框
				}
				//遍历生产数据行
				for(var j=0;j<showFieldsInfo.length;j++){
					//判断td内容的align属性,默认居中
					var sAlign = jo.getDefVal(showFieldsInfo[j]["align"],"left");
					var alignHtml = ' align=\"'+sAlign+'\"';
					var _val = jo.parseExpression(showFieldsInfo[j]['field'], oList[i], (currentPage - 1) * pageSize + i);//解析表达式
					var tips = jo.parseExpression(showFieldsInfo[j]['tips'], oList[i], (currentPage - 1) * pageSize + i);//解析表达式
					/*var _val = showFieldsInfo[j]['field'];
					if(jo.isValid(_val)){
						//以 [= 开头, ] 结尾的格式,表示调用函数对字段进行处理,其中的变量(即该行json的字段值)要使用花括号括起来,例如 [=jo.formatDate('{time}')],time为从数据库查询出来的字段
						if(_val && /^\[=(.)*\]$/.test(_val)){
							//去掉无效的[=和]
							_val = _val.substring(2,_val.length - 1);
							//解析{xx}类型的变量
							_val = jo.getCode(_val,oList[i]);
							//执行该函数
							_val = eval(_val);
						}else if(/\{(.)*\}/g.test(_val)){//解析{xx}类型的变量
							_val = jo.getCode(_val,oList[i]);
						}else if(_val && _val == "_seq"){//序号常量,自动生成序号
							_val = (currentPage - 1) * pageSize + i + 1;
						}else{
							_val = jo.getDefVal(oList[i][_val],"");
						}
					}
					_val = jo.getDefVal(_val,"");//最后对_val进行检查,无效则赋值空格*/
					//生成td
					/*if(typeof(joView.handleItemValue) == "function"){//该接管函数对每个格子的值进行复制,不适用上面解析后的值
						_html += "<td "+alignHtml+"><a href='javascript:joView.edit(\""+oList[i][joView.params["PKName"]]+"\","+JSON.stringify(oList[i]).replace(/\'/ig,"\\\'")+")' style='color:black;' title='点击编辑详情'>"+(oList[i][showFieldsInfo[j]['field']] ? joView.handleItemValue(oList[i][showFieldsInfo[j]['field']],j) : '&nbsp;')+"</a></td>";
					}else{//使用.replace(/\'/ig,"\\\"")是为了解决因为单引号造成的显示问题和点击事件异常
						_html += "<td "+alignHtml+"><a href='javascript:joView.edit(\""+oList[i][joView.params["PKName"]]+"\","+JSON.stringify(oList[i]).replace(/\'/ig,"\\\"")+")' style='color:black;' title='点击编辑详情'>"+_val+"</a></td>";
					}*/
					//2017-05-06修改:将点击事件挂在td上,取消掉之前的a标签
					if(typeof(joView.handleItemValue) == "function"){//该接管函数对每个格子的值进行复制,不适用上面解析后的值
						_html += "<td"+alignHtml+" title=\""+tips+"\" onclick='joView.edit(\""+oList[i][joView.params["PKName"]]+"\","+JSON.stringify(oList[i]).replace(/\'/ig,"\\\'")+")'>"+(oList[i][showFieldsInfo[j]['field']] ? joView.handleItemValue(oList[i][showFieldsInfo[j]['field']],j) : '&nbsp;')+"</td>";
					}else{//使用.replace(/\'/ig,"\\\"")是为了解决因为单引号造成的显示问题和点击事件异常
						var evt = showFieldsInfo[j]['event'];
						if(evt == "none"){//event属性为none时表示禁用点击事件
							_html += "<td "+alignHtml+" title=\""+tips+"\">"+_val+"</td>";
						}else{
							_html += "<td "+alignHtml+" title=\""+tips+"\" onclick='joView.edit(\""+oList[i][joView.params["PKName"]]+"\","+JSON.stringify(oList[i]).replace(/\'/ig,"\\\"")+")'><a href='javascript:;'>"+_val+"</a></td>";
						}
					}
				}
				_html += "</tr>";
			}
			//$("#mainList>tbody").html(_html);
			joView.grid.find(">tbody").html(_html);
			//$("head").append('<script type="text/javascript" src="'+joView.params["JS_table"]+'"><\/script>');//加载列表效果,如果使用的是joGrid则不需要
		}
		if(typeof(joView.setGridDataAfter) == "function"){
			joView.setGridDataAfter(oList);
		}
	}else{
		jo.showMsg("colsInfo无效!");
	}
};
/**
 * 更新分页信息
 */
joView.showPageInfo = function(result){
	var pageBar = $(".page-bar");//分页条
	//验证是否有分页条
	if(!pageBar || !pageBar.attr("class")){
		console.info("分页条未发现!");
		return;
	}
	//验证分页必要参数的有效性
	if(!jo.isValid(result.pageSize) || !jo.isValid(result.pageNumber) /*|| !jo.isValid(result.total)*/){
		console.info("分页必要参数无效!");
		pageBar.html("");
		return;
	}
	var maxPageNormalBarNum = 8;//分页条保持的最大可点击块的数量,确保在页数很多的时候也最多显示8个小块块
	var currentPage = result.pageNumber;//当前页
	joView.params["currentPage"] = currentPage;
	var totalPage = Math.ceil(result.total/result.pageSize);//总页数
	var totalCount = result.total;//记录总数

	if(totalCount < 1 && currentPage == 1){
		console.info("第一页总记录数小于1,隐匿分页条!");
		pageBar.html(" 暂无数据!");
		return;
	}else if(totalCount < 1 && currentPage > 1){
		console.error("[分页条异常] 总记录数小于1，但是当前页大于1。可能是在查询该页记录之前记录发生了删除！");
	}

	var first = '<li onclick="joView.goPage(1)"><a>首页</a></li>';//首页
	var last = '<li onclick="joView.goPage('+(currentPage-1)+')"><a>上一页</a></li>';//上一页
	var normal = '<li class="active" onclick="joView.goPage(1)"><a>1</a></li>';//普通的页数
	var next = '<li onclick="joView.goPage('+(currentPage+1)+')"><a>下一页</a></li>';//下一页
	var end = '<li onclick="joView.goPage('+totalPage+')"><a>尾页</a></li>';//尾页

	//首页和上一页
	if(currentPage > 1){
		//处理因为同步问题带来的特殊情况
		if((currentPage - totalPage) > 1){//当前页大于总页数至少1页,上一页禁用
			last = '<li class="disabled" onclick=""><a>上一页</a></li>';
		}
	}else{//当前页小于等于1,上一页和首页都禁用
		first = '<li class="disabled" onclick=""><a>首页</a></li>';
		last = '<li class="disabled" onclick=""><a>上一页</a></li>';
	}

	//下一页和尾页
	if(currentPage < totalPage){

	}else{
		next = '<li class="disabled" onclick=""><a>下一页</a></li>';
		end = '<li class="disabled" onclick=""><a>尾页</a></li>';
	}

	if(totalPage > 1){//总页数大于1时,处理分页小块
		normal = '';
		if(totalPage <= maxPageNormalBarNum){//总页数小于等于最大限制数,正常循环显示
			for(var i=0;i<totalPage;i++){
				var n = i + 1;//页数
				if(currentPage == n){//当前页着色
					normal += '<li class="active" onclick="joView.goPage('+n+')"><a>'+n+'</a></li>';
				}else{
					normal += '<li onclick="joView.goPage('+n+')"><a>'+n+'</a></li>';
				}
			}
		}else{
			var l = Math.floor(maxPageNormalBarNum/2);//中心左边个数
			var r = maxPageNormalBarNum - 1 - l;//中心右边个数

			if(currentPage <= l){
				for(var i=0;i<maxPageNormalBarNum;i++){//这里和上面的循环的区别就在这里可以完全显示最大允许数量的块
					var n = i + 1;//页数
					if(currentPage == n){//当前页着色
						normal += '<li class="active" onclick="joView.goPage('+n+')"><a>'+n+'</a></li>';
					}else{
						normal += '<li onclick="joView.goPage('+n+')"><a>'+n+'</a></li>';
					}
				}
			}else if(currentPage > l && currentPage < (totalPage - r)){//当前页超出限制范围一半且距离最大页也差一半时,以当前页为中心,左右扩充到限制数大小
				var s = currentPage - l;
				var e = currentPage + r;
				while(s <= e){
					if(currentPage == s){//当前页着色
						normal += '<li class="active" onclick="joView.goPage('+s+')"><a>'+s+'</a></li>';
					}else{
						normal += '<li onclick="joView.goPage('+s+')"><a>'+s+'</a></li>';
					}
					s++;
				}
			}else{//当前页超出右临界点
				for(var i=0;i<maxPageNormalBarNum;i++){
					var n = totalPage - maxPageNormalBarNum + 1 + i;//页数
					if(currentPage == n){//当前页着色
						normal += '<li class="active" onclick="joView.goPage('+n+')"><a>'+n+'</a></li>';
					}else{
						normal += '<li onclick="joView.goPage('+n+')"><a>'+n+'</a></li>';
					}
				}
			}
		}
	}
	var _size = '';
	var _html = '';
	var pageSizeArr = joView.params["pageSizeArr"];
	//var defSize = joView.params["pageSize"];
	if(jo.isValid(pageSizeArr) && typeof(pageSizeArr) == "object"){
		//生产选择项
		var flag = false;//标记pagesize是否在备选池中
		_size += '<select class="input-sm" onchange="joView.choicePageSize(this.value)">';
		for(var i=0;i<pageSizeArr.length;i++){
			if(result.pageSize && result.pageSize == pageSizeArr[i]){
				_size += '<option value="' + pageSizeArr[i] + '" selected="selected">' + pageSizeArr[i] + '</option>';
				flag = true;
			}else{
				_size += '<option value="' + pageSizeArr[i] + '">' + pageSizeArr[i] + '</option>';
			}
		}
		_size += '</select>';
		if(!flag){
			console.error("每页记录数pageSize在备选池pageSizeArr中检索不到，请检查相关参数设置！")
			_size = result.pageSize;
		}
		_html = '<div class="pull-left">当前第&nbsp;'+currentPage+"&nbsp;页，每页&nbsp;"+_size+"&nbsp;条，共&nbsp;"+totalCount+"&nbsp;条记录</div>";
	}
	_html += '<ul class="pagination pull-right">'
		+ first
		+ last
		+ normal
		+ next
		+ end
		+ '</ul>';
	pageBar.html(_html);
};
/**
 * 重新加载当前页
 */
joView.reloadCurrentPage = function(){
	joView.goPage(joView.params["currentPage"]);
};
/**
 * 选择每页显示多少条
 * @param iNum 每页多少条数据
 */
joView.choicePageSize = function(iNum){
	joView.params["pageSize"] = iNum;
	joView.goPage(1);
};
/**
 * 设置默认每页显示多少条
 * @param iNum 每页多少条数据
 */
joView.setDefaultPageSize = function(iNum){
	joView.params["pageSize"] = jo.getDefVal(iNum,joView.params["pageSize"]);
	var _html = '';
	_html += '<option value="5">5</option>';
	_html += '<option value="10">10</option>';
	_html += '<option value="'+joView.params["pageSize"]+'" selected="selected">'+joView.params["pageSize"]+'</option>';
	_html += '<option value="15">15</option>';
	_html += '<option value="20">20</option>';
	$("#pageSize").html(_html);
};
/**
 * 初始化数据
 */
joView.initData = function(){
	
};
/**
 * 初始化视图参数,bam组件初始化页面参数入口
 */
joView.initViewParams = function(oParams){
	
};
/**
 * 格式化UI
 */
joView.formatUI = function(){
	//初始化面包屑
	joView.initPlace();
	//初始化按钮
	joView.initBtn();
	//初始化Grid标题行
	joView.initGridHead();
	//初始化分页脚信息
	//joView.initFoot();
};
/**
 * 初始化分页脚
 * 主要是初始化每页多少条,在加载数据之前执行
 */
joView.initFoot = function(){
	var pageSizeArr = joView.params["pageSizeArr"];
	if(jo.isValid(pageSizeArr) && typeof(pageSizeArr) == "object"){
		$("#pageSize").html("");//情况默认选择项
		var _html = '';
		//生产选择项
		for(var i=0;i<pageSizeArr.length;i++){
			_html += '<option value="' + pageSizeArr[i] + '">' + pageSizeArr[i] + '</option>';
		}
		//插入选择项
		$("#pageSize").html(_html);
		//选择默认项
		var defPageSize = joView.params["pageSize"];
		$("#pageSize").val(defPageSize);
	}
};
/**
 * 初始化按钮
 * 权限处理
 */
joView.initBtn = function(){
	$(".button-bar>button[isShow]").each(function(index,element){
		var isShow = $(this).attr("isShow");
		if(isShow == ""){//isShow为空时不隐藏
			$(this).show();
		}else{
			//当返回false或'false'时才隐藏
			if(joView.execCode(isShow) == false || joView.execCode(isShow) == 'false'){
				$(this).hide();
			}else{
				$(this).show();
			}
		}
	});
};
/**
 * 执行字符串形式的代码
 */
joView.execCode = function(sCode){
	if(jo.isValid(sCode)){//待执行代码的有效性
		return eval(sCode);
	}else{
		return false;
	}
};
/**
 * 初始化Grid标题行
 */
joView.initGridHead = function(){
	if(jo.isValid(joView.params["colsInfo"])){
		/*
		 * 生成表头
		 */
		if(typeof(joView.setGridHead) == "function"){//生成Grid头接管函数
			joView.setGridHead();
		}else{
			var showFieldsInfo = joView.params["colsInfo"];
			var checkStyle = jo.getDefVal(joView.params["checkStyle"],"");
			var _headHtml = "<tr class='jo-view-table-header'>";
			var checkWidth = jo.getDefVal(joView.params["checkStyleWidth"],"5%");
			if(checkStyle == "checkBox"){//复选框
				_headHtml += '<th style="font-weight: normal;text-align:center;width:'+checkWidth+';"><input type="checkbox" onclick="jo.checkAll(\''+joView.params["PKName"]+'\')" id="checkAll"/></th>';
			}else if(checkStyle == "radio"){//单选框
				_headHtml += '<th style="font-weight: normal;text-align:center;width:'+checkWidth+';">选择</th>';
			}else if(checkStyle == "order"){
				_headHtml += '<th style="font-weight: normal;text-align:center;width:'+checkWidth+';">序号</th>';
			}else{
				//不要选择框
			}
			//遍历生产表头
			for(var i=0;i<showFieldsInfo.length;i++){
				var lcr = jo.getDefVal(showFieldsInfo[i]["headAlign"], 'left');//标题行文本位置,默认left
				_headHtml += '<th style="font-weight: normal;text-align:'+lcr+';width:' + showFieldsInfo[i]["width"] + ';">' + showFieldsInfo[i]["title"];
				if(showFieldsInfo[i]["order"]){//当前列开启排序功能
					_headHtml += ' <span style="display: inline-block;width: 16px;height: 15px;position: relative;">';/*caret*/
					_headHtml += '<div class="order-asc cursor-hand fa fa-angle-up" field="'+showFieldsInfo[i]["order"]+'" grid="'+joView.Grid.id+'" onclick="joView.orderSelect(this, true)" style="font-weight: bold;height:7px;width: 15px;padding: 0px;margin:0px;position: absolute;top:0px;left:0px;"></div>';//<!--<i class="fa fa-caret-up" aria-hidden="true"></i>-->
					_headHtml += '<div class="order-desc cursor-hand fa fa-angle-down" field="'+showFieldsInfo[i]["order"]+'" grid="'+joView.Grid.id+'" onclick="joView.orderSelect(this, false)" style="font-weight: bold;height:7px;width: 15px;padding: 0px;margin:0px;position: absolute;bottom:0px;left:0px;"></div>';//<!--<i class="fa fa-caret-down" aria-hidden="true"></i>-->
					_headHtml += '</span>';
				}
				_headHtml += '</th>';
			}
			_headHtml += "</tr>";
			//$("#mainList>thead").html(_headHtml);
			joView.grid.find(">thead").html(_headHtml);
		}
	}
};
/**
 * 排序查询
 * @param element 被点击的排序元素:this
 * @param isAsc 升序标识,true表示升序,false表示降序
 */
joView.orderSelect = function(element, isAsc){
	var p = $(element).parent();//排序容器
	var field = $(element).attr("field");//待排序字段
	var arr = p.find("div");//0为升序,1为降序
	//将表格下所有的排序图标重置
	joView.grid.find(".order-asc").removeClass("fa-caret-up");
	joView.grid.find(".order-desc").removeClass("fa-caret-down");
	joView.grid.find(".order-asc").addClass("fa-angle-up");
	joView.grid.find(".order-desc").addClass("fa-angle-down");
	if(arr){
		if(isAsc){
			$(arr[0]).removeClass("fa-angle-up");
			$(arr[0]).addClass("fa-caret-up");//变成实心图标
			//排序查询
			joView.putParam("orderBy", field);
			joView.putParam("orderType", "asc");
		}else{
			$(arr[1]).removeClass("fa-angle-down");
			$(arr[1]).addClass("fa-caret-down");//变成实心图标
			//排序查询
			joView.putParam("orderBy", field);
			joView.putParam("orderType", "desc");
		}
		joView.select();//查询
	}else{
		console.error("joView排序查询 : 未找到排序标签!");
	}
};
/**
 * 初始化面包屑
 */
joView.initPlace = function (){
	var places = $("td.place[type=auto]").text();
	if(jo.isValid(places)){
		var placeArr = places.split(",");
		var _place = "<ul><li>&nbsp;&nbsp;<b>位置：</b></li>";
		if(placeArr.length > 0){
			_place += "<li>"+placeArr[0]+"</li>";
			for(var i=1;i<placeArr.length;i++){
				_place += "<li class='arrows'>&nbsp;&nbsp;&nbsp;</li>";
				_place += "<li>"+placeArr[i]+"</li>";
			}
		}
		_place += "</ul>";
		$("td.place[type=auto]").html(_place);
	}
};
/**
 * 新增按钮事件
 * 打开新增页面
 * @param sUrl 打开表单的地址
 */
joView.add = function(sUrl,sWidth,sHeight,sTitle){
	var sUrl = jo.getDefVal(sUrl,joView.params["formUrl"]);
	if(jo.isValid(sUrl)){
		sUrl = sUrl + jo.getLinkSign(sUrl) + joView.params["transferParam"];
		//getPopWin(sUrl,jo.getDefVal(sWidth,'780px'),jo.getDefVal(sHeight,'80%'),jo.getDefVal(sTitle,'新增'));
		var idx;//弹窗的索引
		var renderWindow;//渲染表单窗口的window对象
		if(joView.params["winRender"] == "top"){//在顶部打开表单
			renderWindow = top;
		}else if(joView.params["winRender"] == "parent"){//在父页面打开
			renderWindow = parent;
		}else{//默认在当前页打开
			renderWindow = window;
		}
		if(!renderWindow["jo"]){
			console.error("目标窗口["+joView.params["winRender"]+"]未发现jo对象,请确认是否正确引入jo依赖!");
			return;
		}
		//在目标窗口弹窗
		idx = renderWindow.jo.showWin(sUrl,
			jo.getDefVal(sWidth, joView.params["formWidth"]),
			jo.getDefVal(sHeight, joView.params["formHeight"]),
			jo.getDefVal(sTitle, joView.params["winTitleOfAdd"]),
			joView.params["winNameOfAdd"]
		);
		if(!renderWindow["joViewBus"]){
			renderWindow["joViewBus"] = [];
		}
		//同一个页面内,layer弹窗的索引值是唯一的,可以在表单中通过parent[joViewBus][idx]找到joView所在的window
		renderWindow["joViewBus"][idx] = window;
	}
};
/**
 * 获取多选框(单选)选择结果
 * @param name
 * @returns {*|*|string}
 */
joView.getCheckBoxValue = function(name){
	if(!name){
		name = joView.params["PKName"];
	}
	return jo.getCheckBoxValue(name);
};
/**
 * 删除
 */
joView.del = function(sIds){
	if(jo.isValid(joView.params["deleteUrl"])){
		var deleteUrl = joView.params["deleteUrl"];
		var idStr = "";
		if(!jo.isValid(sIds)){//没有传入ID,获取选中复选框的ID
			idStr = joView.getCheckBoxValue(joView.params["PKName"]);
		}else{//有传入值
			idStr = sIds;
		}
		if(idStr == ""){
			jo.showMsg("请选择待删除选项");
		}else{
			jo.confirm("确定要删除吗？",function () {
				var url = deleteUrl + jo.getLinkSign(deleteUrl) + "ids=" + idStr;
				jo.postAjax(url,{},function(result){
					if(result.code == 0){
						jo.showMsg("删除成功");
						joView.reloadCurrentPage();//重新加载当前页数据
						if(typeof (joView.delSuccessOver) == "function"){
							joView.delSuccessOver(result, idStr);
						}
					}else{
						jo.showMsg(result.info)
					}
				});
			 });
		}
	}else{
		jo.showMsg("请检查删除配置参数{deleteUrl}是否有效!");
	}
};
/**
 * 编辑
 * 数据列表的点击事件
 * @param id 数据的主键值
 * @param sWidth 弹窗的宽度,或者是该行数据的json格式的值(object类型)
 */
joView.edit = function(id,sWidth,sHeight,sTitle){
	if(typeof(joView.clickItem) == "function"){
		joView.clickItem(id,sWidth,sHeight,sTitle);
	}else{
		if(jo.isValid(joView.params["formUrl"])){//有效的表单地址
			if(typeof(sWidth) == "object"){
				sWidth = '';
			}
			//getPopWin(joView.params["formUrl"]+jo.getLinkSign(joView.params["formUrl"])+joView.params["PKName"]+'='+id +"&"+ joView.params["transferParam"],jo.getDefVal(sWidth,'780px'),jo.getDefVal(sHeight,'80%'),jo.getDefVal(sTitle,'编辑'));
			var idx;//弹窗的索引
			var renderWindow;//渲染表单窗口的window对象
			if(joView.params["winRender"] == "top"){//在顶部打开表单
				renderWindow = top;
			}else if(joView.params["winRender"] == "parent"){//在父页面打开
				renderWindow = parent;
			}else{//默认在当前页打开
				renderWindow = window;
			}
			if(!renderWindow["jo"]){
				console.error("目标窗口["+joView.params["winRender"]+"]未发现jo对象,请确认是否正确引入jo依赖!");
				return;
			}
			idx = renderWindow.jo.showWin(joView.params["formUrl"]+jo.getLinkSign(joView.params["formUrl"])+joView.params["PKName"]+'='+id +"&"+ joView.params["transferParam"],
				jo.getDefVal(sWidth, joView.params["formWidth"]),
				jo.getDefVal(sHeight, joView.params["formHeight"]),
				jo.getDefVal(sTitle, joView.params["winTitleOfUpdate"]),
				joView.params["winNameOfUpdate"]
			);
			if(!renderWindow["joViewBus"]){
				renderWindow["joViewBus"] = [];
			}
			//同一个页面内,layer弹窗的索引值是唯一的,可以在表单中通过parent[joViewBus][idx]找到joView所在的window
			renderWindow["joViewBus"][idx] = window;
		}
	}



};